SnowflakeのSecure Viewを試してみた #SnowflakeDB
※本エントリは、Snowflakeをより使いこなそう! Advent Calendar 2021の4日目の記事となります。
さがらです。
SnowflakeのSecure Viewを試してみたので、その内容をまとめてみます。
Secure Viewとは?
通常のviewはSELECT文が書かれたSQLと共に定義されるため、DDL文を取得する関数などを用いることでそのSQLの定義文がわかるようになっています。
しかしSecure Viewを用いることで、その名の通り「Secure」になるため、viewに定義されたSELECT文を相手に公開せずviewが返す結果だけを提供する事が出来ます。
以下の公式Docも併せて御覧ください。(日本語だと「安全なビュー」と表記されています。)
試してみた
以下2つのviewを用意してみます。
- view「aaa」:普通のviewとして定義
- view「bbb」:Secure Viewとして定義
この上で、前準備として以下のクエリを実行します。
-- データベースとテーブルの定義 USE ROLE sysadmin; CREATE DATABASE secure_view_test; CREATE TABLE sample_table (no int); -- view「aaa」は普通のviewとして定義 CREATE VIEW aaa AS SELECT * FROM sample_table LIMIT 10; -- view「bbb」はSecure Viewとして定義 CREATE SECURE view bbb AS SELECT * FROM sample_table LIMIT 10; -- 閲覧制限をかけたいロール「custom_role」を作る USE ROLE accountadmin; CREATE ROLE custom_role; -- データベース、スキーマ、viewに対する権限を付与。viewにだけ権限与えるのがポイント GRANT USAGE ON DATABASE secure_view_test TO ROLE custom_role; GRANT USAGE ON SCHEMA secure_view_test.public TO ROLE custom_role; GRANT SELECT ON ALL VIEWS IN SCHEMA secure_view_test.public TO ROLE custom_role; -- ウェアハウスの使用権限を付与する GRANT USAGE ON WAREHOUSE compute_wh TO ROLE custom_role; -- ユーザーへのcustom_roleの付与 GRANT ROLE custom_role TO USER satoshisagara;
この上で、GET_DDLという対象のオブジェクトのDDL文を確認できる関数を使ってみます。
まず通常のviewの場合は、このようにDDL文が見えてしまいます。
USE ROLE custom_role; SELECT GET_DDL('view', 'aaa');
一方でSecure Viewの場合は、このようにエラーを返すことで、viewに定義されたSELECT文がわからないようになっています。viewに定義したSELECT文の内容が見えず、まさにSecureな状態であることがわかりますね。
USE ROLE custom_role; SELECT GET_DDL('view', 'bbb');
Secure Viewの注意点
ここまでの説明で、「viewの定義内容を見せたくないし、それならもう全てのviewをSecure Viewにしちゃおうかな」と考えた方、1点だけ注意点があります。
それは、Secure Viewを使うと、クエリパフォーマンスに影響を及ぼす可能性があります。
これは、Secure Viewを使うと、Snowflakeがクエリパフォーマンスの最適化のために使用するクエリオプティマイザーが一部の最適化処理を行えなくなるためです。
そのため、すべてのviewをSecure Viewにするということを行ってしまうと、思わぬ所でパフォーマンス低下に繋がりますのでご注意ください。
どういった時に使えばいいの?
ではこのSecure View、いつ使えばいいのでしょうか。
例えばSnowflakeにはデータシェアリングの機能があり、viewも共有することができます。そんな時に、viewに定義したSQLに指標を出すために必要な計算ロジックなどを組み込んでおり、それを相手には見せたくない…というケースがあると思います。
そういった時に、このSecure Viewを使うことで詳細なロジックを相手に見せることなく、viewが返す結果だけを共有することが出来ます。
ただ、前述の注意点でも述べたとおりSecure Viewはパフォーマンスの低下に繋がる可能性がありますので、その点を考慮した上で適用してみてください。
次回
Snowflakeをより使いこなそう! Advent Calendar 2021、次回の5日目では、「Snowflakeのアンロードで単一ファイルと複数ファイルの違いを比較してみた #SnowflakeDB」というタイトルで執筆します。お楽しみに!